<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="jquery.js" charset="utf-8"></script>
    <script>
        // Promise构造函数接受一个函数作为参数，该函数的两个参数分别是resolve和reject
        //封装 Promise API
        function reqs(isFlag, data, err) {
            return new Promise((resolve, reject) => {
                if (isFlag) {
                    resolve(data)
                } else {
                    reject(err)
                }
            });
        }
        const promiseOne = new reqs(true, 1, '操作失败');
        const promiseTwo = new reqs(true, 2, '操作失败');
        const promiseThree = new reqs(false, 3, '操作失败');

        promiseOne
            .then((data) => {
                console.log(data);
                //当 promiseOne 读取成功，当前函数 return 的结果就能在后面的 then 中的回调函数接收到
                return promiseTwo
            }, (err) => {
                console.log(err);
            })
            //这里是 promiseTwo 的 resolve
            .then((data) => {
                console.log(data);
                return promiseThree
            }, (err) => {
                console.log(err);
            })
            //这里是 promiseThree 的 resolve
            .then((data) => {
                console.log(data);
            }, (err) => {
                //因为 promiseThree 是 false ，所以结果是 reject 传的 '操作失败'
                console.log(err);
            })

        // pending（进行中）：等待状态，比如正在进行网络请求或者定时器没有到时间
        // fulfilled （已成功）：满足状态，当主动回调了 resolve 时，就处于该状态，并且回调.then()
        // rejected（已失败）：拒绝状态，当主动回调了 reject 时，就处于该状态，并且回调.catch()
        // Promise对象的状态改变，只有两种可能：从pending变为 fulfilled 和从pending变为rejected，一旦确定就不会再改变

        //   封装ajax
        let ajax = function (url, params, type = 'POST') {
            return new Promise((resolve, reject) => {
                $.ajax({
                    type,
                    url,
                    data: params,
                    dataType: 'json',
                    success(res) {
                        resolve(res)
                    },
                    error(res) {
                        reject('响应错误')
                    }
                })
            })
        }
        // ajax将多个promise封装为一个新的promise，all接收一个数组作为参数，数组里可以是Promise对象
        // 也可以是别的值，只有Promise会等待状态改变
        // 当所有的子Promise都完成，该Promise完成，返回值是全部值的数组。
        // 有任何一个失败，该Promise失败，返回值是第一个失败的子Promise结果

    </script>
</head>

<body>

</body>

</html>